package com.hhkj.admin.order.service.biz;

import com.hhkj.admin.order.common.cont.OrderConst;
import com.hhkj.admin.order.domain.Order;
import com.hhkj.admin.order.domain.OrderItem;
import com.hhkj.admin.order.model.extend.SaleAndRootInfo;
import com.hhkj.admin.order.model.req.OrderReq;
import com.hhkj.admin.order.model.res.OrderRes;
import com.ruoyi.common.base.biz.service.biz.BaseBizService;
import com.ruoyi.common.model.excel.ValidateBatchRes;
import com.ruoyi.common.model.excel.res.ExcelImportRes;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

public interface OrderBizService extends BaseBizService<Order, OrderReq, OrderRes> {

    /**
     * 创建导出的excel
     * @param orderReq
     * @return
     */
    Workbook createExportWorkbook(OrderReq orderReq);

    /**
     * 创建导入模板
     *
     * @return 导入模板excel对象
     */
    Workbook createImportTemplate();

    /**
     * 校验子订单信息。
     * 如果全部正确 : 创建订单并保存订单item。
     * 如果出现错误 : 错误信息会在返回值中说明原因。
     *
     * @param saleId 销售id
     * @param file   需要导入的文件
     * @return 结果，如果错误则会说明原因
     */
    ExcelImportRes validateAndCreateOrderByExcel(Long saleId,
                                                 MultipartFile file,
                                                 OrderConst.SourceTypeCode sourceTypeCode,
                                                 Long createBy);

    /**
     * 校验子订单信息，
     * 如果全部正确 : 创建订单并保存订单item
     * 如果出现错误 : 错误信息会在返回值中说明原因
     *
     * @param saleId        销售id
     * @param orderItemList 子订单列表
     * @return 结果，如果错误则会说明原因
     */
    Order validateAndCreateOrderByOrderItemList(Long saleId,
                                                List<OrderItem> orderItemList,
                                                OrderConst.SourceTypeCode sourceTypeCode,
                                                Long createBy);

    /**
     * 校验订单，如果通过则支付订单
     *
     * @param orderReq 至少要包括id，支付方式payMethodCode，实付金额payPrice, 打款时间payTime
     * @param createBy 创建者
     * @return 如果校验失败，则支付失败，会返回错误原因
     */
    Order validateAndPayOrder(OrderReq orderReq, Long createBy);

    /**
     * 获取所属销售和所属商家
     *
     * @param saleId
     * @return
     */
    SaleAndRootInfo getSaleAndRoot(Long saleId);

    /**
     * 支付订单，保存相关信息
     * @param order 订单信息
     * @param orderItemList 子订单列表
     * @param orderReq 子订单列表,支付请求，orderReq 至少要包括:支付方式payMethodCode，实付金额payPrice, 打款时间payTime
     * @param createBy 创建人
     * @return 返回创建完成的order
     */
    Order afterPaySuccess(Order order, List<? extends OrderItem> orderItemList, OrderReq orderReq, Long createBy);

    /**
     * 支付订单，保存相关信息
     * @param orderReq 子订单列表,支付请求，orderReq 至少要包括: id，支付方式payMethodCode，实付金额payPrice, 打款时间payTime
     * @param createBy 创建人
     * @return 返回创建完成的order
     */
    Order afterPaySuccess(OrderReq orderReq, Long createBy);

    /**
     * 支付订单前，校验订单，包括订单校验和子订单校验
     * @param orderId
     * @param createBy
     * @return
     */
    Order validateBeforePayOrder(Long orderId, Long createBy);
}
